问题: 如何用正则表达式替换字符串中的指定内容(re.sub()基础用法)?

👇 点击展开/折叠 面试背诵模板(建议先背这个) re.sub(pattern, repl, string, count=0, flags=0) 用于将字符串中所有匹配 pattern 的子串替换为 repl,返回新字符串。原字符串不变。repl 可以是普通字符串(支持 \1、\2 等反向引用捕获组),也可以是函数(接收 Match 对象,返回替换字符串)。count 参数控制最大替换次数,默认 0 表示全部替换。flags 用于设置匹配模式(如 re.IGNORECASE)。常见用法:数据脱敏(隐藏手机号中间四位)、格式统一(将多种日期格式替换为标准格式)、内容清理(移除 HTML 标签)。
---

基础用法示例

1
2
3
4
5
6
7
8
import re
text = "手机号: 13812345678, 备用: 13987654321"

# 基础替换:将数字替换为 X
print(re.sub(r'\d', 'X', text)) # 手机号: XXXXXXXXXXX, 备用: XXXXXXXXXXX

# 限制替换次数(仅替换第一个数字)
print(re.sub(r'\d', 'X', text, count=1)) # 手机号: X3812345678, 备用: 13987654321

使用反向引用(捕获组)进行灵活替换

反向引用 \1、\2 等可引用匹配到的捕获组内容,实现保留部分内容的替换。

1
2
3
4
5
6
7
8
9
# 脱敏手机号:保留前3位和后4位,中间替换为 ****
phone = "13812345678"
masked = re.sub(r'(\d{3})\d{4}(\d{4})', r'\1****\2', phone)
print(masked) # 138****5678

# 日期格式转换:将 YYYY-MM-DD 转为 DD/MM/YYYY
text = "今天日期是 2024-10-01"
converted = re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\3/\2/\1', text)
print(converted) # 今天日期是 01/10/2024

使用函数作为替换参数(动态替换)

若替换逻辑复杂(如根据匹配内容动态计算新值),可将 repl 设为函数,函数接收 Match 对象,返回字符串。

1
2
3
4
5
6
def double(match):
value = int(match.group(0))
return str(value * 2)

text = "价格: 100元, 折扣: 20元"
print(re.sub(r'\d+', double, text)) # 价格: 200元, 折扣: 40元

常见应用场景速览

场景 示例模式 替换目标
移除 HTML 标签 <[^>]+> 替换为空字符串
统一空格 \s+ 替换为单个空格
脱敏邮箱(保留首尾) (\w{2})\w+@(\w+) r'\1***@\2'
过滤非数字字符 \D 替换为空(仅保留数字)
1
2
3
4
# 保留数字
print(re.sub(r'\D', '', 'abc123def456')) # '123456'
# 移除多余空白
print(re.sub(r'\s+', ' ', 'hello world')) # 'hello world'

注意事项(性能与陷阱)

  • re.sub 默认替换所有匹配项,若只需替换首次,设置 count=1。
  • 替换字符串中的反斜杠 \ 需使用原始字符串 r'',避免转义冲突(如 \1 在普通字符串中需写为 \\1)。
  • 若替换内容中包含 \ 或 & 等特殊字符,需视情况额外转义(re.escape 可自动转义字符串中的特殊字符)。